﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace BUGCOME.Infrastructure.Helper
{
    /// <summary>
    /// 随机数生成工具类 - 提供生成随机数字、字符串等功能
    /// </summary>
    public class RandomHelper
    {
        /// <summary>
        /// 生成指定长度的纯数字随机验证码
        /// </summary>
        /// <param name="length">验证码长度，建议范围[4, 8]</param>
        /// <returns>固定长度的数字字符串，例如"1234"</returns>
        /// <exception cref="ArgumentOutOfRangeException">当长度小于1或大于100时抛出</exception>
        /// <example>
        /// // 生成6位验证码
        /// string code = RandomHelper.GenerateNum(6); // 可能返回"735912"
        /// </example>
        public static string GenerateNum(int length)
        {
            // 参数校验：确保长度在合理范围内
            if (length < 1 || length > 100)
            {
                throw new ArgumentOutOfRangeException(nameof(length), "验证码长度需在1-100之间");
            }

            // 定义数字字符集（0-9）
            char[] digitChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
            var randomBuilder = new StringBuilder(length);
            var random = new Random();

            // 循环生成指定长度的随机数字
            for (int i = 0; i < length; i++)
            {
                // 从字符集中随机选取一个字符
                int randomIndex = random.Next(digitChars.Length);
                randomBuilder.Append(digitChars[randomIndex]);
            }

            return randomBuilder.ToString();
        }

        /// <summary>
        /// 生成指定长度的随机字符串（包含数字和字母）
        /// </summary>
        /// <param name="length">字符串长度</param>
        /// <param name="isUpperCase">是否生成大写字母，默认false</param>
        /// <returns>混合数字和字母的随机字符串</returns>
        /// <example>
        /// // 生成8位随机字符串（包含小写字母和数字）
        /// string randomStr = RandomHelper.GenerateString(8); // 可能返回"a7x3d9k2"
        /// </example>
        public static string GenerateString(int length, bool isUpperCase = false)
        {
            // 定义字符集：数字+小写字母+大写字母（根据参数动态调整）
            string charSet = "0123456789abcdefghijklmnopqrstuvwxyz";
            if (isUpperCase)
            {
                charSet += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            }

            char[] chars = charSet.ToCharArray();
            var builder = new StringBuilder(length);
            var random = new Random();

            for (int i = 0; i < length; i++)
            {
                int index = random.Next(chars.Length);
                builder.Append(chars[index]);
            }

            return builder.ToString();
        }

        /// <summary>
        /// 生成哈希文件名（仅主体，不含扩展名）
        /// </summary>
        public static string HashFileName()
        {
            string str = Guid.NewGuid().ToString("N");
            using var md5 = MD5.Create();
            byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
            return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
        }
    }
}
